/*
 * Copyright (c) 2007, 2011, Oracle and/or its affiliates. All rights reserved.
 * ORACLE PROPRIETARY/CONFIDENTIAL. Use is subject to license terms.
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */

package java.nio.file;

import java.nio.file.attribute.BasicFileAttributes;
import java.io.IOException;
import java.util.Objects;

/**
 * A simple visitor of files with default behavior to visit all files and to
 * re-throw I/O errors.
 *
 * <p> Methods in this class may be overridden subject to their general contract.
 *
 * @param <T> The type of reference to the files
 * @since 1.7
 */

public class SimpleFileVisitor<T> implements FileVisitor<T> {

  /**
   * Initializes a new instance of this class.
   */
  protected SimpleFileVisitor() {
  }

  /**
   * Invoked for a directory before entries in the directory are visited.
   *
   * <p> Unless overridden, this method returns {@link FileVisitResult#CONTINUE
   * CONTINUE}.
   */
  @Override
  public FileVisitResult preVisitDirectory(T dir, BasicFileAttributes attrs)
      throws IOException {
    Objects.requireNonNull(dir);
    Objects.requireNonNull(attrs);
    return FileVisitResult.CONTINUE;
  }

  /**
   * Invoked for a file in a directory.
   *
   * <p> Unless overridden, this method returns {@link FileVisitResult#CONTINUE
   * CONTINUE}.
   */
  @Override
  public FileVisitResult visitFile(T file, BasicFileAttributes attrs)
      throws IOException {
    Objects.requireNonNull(file);
    Objects.requireNonNull(attrs);
    return FileVisitResult.CONTINUE;
  }

  /**
   * Invoked for a file that could not be visited.
   *
   * <p> Unless overridden, this method re-throws the I/O exception that prevented
   * the file from being visited.
   */
  @Override
  public FileVisitResult visitFileFailed(T file, IOException exc)
      throws IOException {
    Objects.requireNonNull(file);
    throw exc;
  }

  /**
   * Invoked for a directory after entries in the directory, and all of their
   * descendants, have been visited.
   *
   * <p> Unless overridden, this method returns {@link FileVisitResult#CONTINUE
   * CONTINUE} if the directory iteration completes without an I/O exception;
   * otherwise this method re-throws the I/O exception that caused the iteration
   * of the directory to terminate prematurely.
   */
  @Override
  public FileVisitResult postVisitDirectory(T dir, IOException exc)
      throws IOException {
    Objects.requireNonNull(dir);
    if (exc != null) {
      throw exc;
    }
    return FileVisitResult.CONTINUE;
  }
}
